﻿namespace 异常捕获处理的简单示例
{
    internal class Program
    {



        static void Main(string[] args)
        {
            Console.WriteLine("=== 异常处理教学示例 ===");
            Console.WriteLine("将依次演示几种常见异常的捕获与处理\n");

            // 演示不同类型的异常处理
            DemonstrateDivideByZero();
            DemonstrateFormatException();
            DemonstrateIndexOutOfRange();
            DemonstrateCustomException();

            Console.WriteLine("\n=== 所有示例演示完毕 ===");
        }



        // 示例1：演示除零异常（DivideByZeroException）
        static void DemonstrateDivideByZero()
        {
            Console.WriteLine("\n【示例1：除零异常处理】");
            int dividend = 10;
            int divisor = 0; // 这里会导致除零异常

            try
            {
                // try块：包含可能发生异常的代码
                int result = dividend / divisor;
                Console.WriteLine($"计算结果：{result}"); // 若异常发生，此行不会执行
            }
            // catch块：捕获特定类型的异常并处理
            catch (DivideByZeroException ex)
            {
                // 输出异常信息（教学时可说明：ex.Message包含错误描述）
                Console.WriteLine($"捕获到除零异常：{ex.Message}");
                Console.WriteLine("处理方式：除数不能为0，请重新输入有效的除数");
            }
            finally
            {
                // finally块：无论是否发生异常，都会执行
                // 通常用于资源清理（如关闭文件、释放连接等）
                Console.WriteLine("除零异常示例的finally块执行完毕\n");
            }
        }

        // 示例2：演示格式转换异常（FormatException）
        static void DemonstrateFormatException()
        {
            Console.WriteLine("【示例2：格式转换异常处理】");
            string input = "abc"; // 此字符串无法转换为整数

            try
            {
                // 尝试将字符串转换为整数（非数字格式会抛FormatException）
                int number = int.Parse(input);
                Console.WriteLine($"转换结果：{number}"); // 若异常发生，此行不会执行
            }
            catch (FormatException ex)
            {
                Console.WriteLine($"捕获到格式异常：{ex.Message}");
                Console.WriteLine("处理方式：输入的字符串不是有效的数字格式");
            }
            // 可以添加多个catch块捕获不同类型异常
            catch (OverflowException ex)
            {
                // 若输入数字超出int范围，会触发此异常
                Console.WriteLine($"捕获到溢出异常：{ex.Message}");
            }
            finally
            {
                Console.WriteLine("格式转换异常示例的finally块执行完毕\n");
            }
        }

        // 示例3：演示数组索引越界异常（IndexOutOfRangeException）
        static void DemonstrateIndexOutOfRange()
        {
            Console.WriteLine("【示例3：数组索引越界异常处理】");
            int[] numbers = { 1, 2, 3 }; // 数组长度为3，有效索引：0、1、2

            try
            {
                // 访问索引3（超出数组范围）
                Console.WriteLine($"访问数组元素：{numbers[3]}");
            }
            catch (IndexOutOfRangeException ex)
            {
                Console.WriteLine($"捕获到索引越界异常：{ex.Message}");
                Console.WriteLine($"处理方式：数组长度为{numbers.Length}，有效索引范围是0到{numbers.Length - 1}");
            }
            finally
            {
                Console.WriteLine("数组索引异常示例的finally块执行完毕\n");
            }
        }

        // 示例4：演示自定义异常的抛出与捕获
        static void DemonstrateCustomException()
        {
            Console.WriteLine("【示例4：自定义异常处理】");
            int age = -5; // 无效的年龄值

            try
            {
                // 检查年龄有效性，若无效则抛出自定义异常
                if (age < 0 || age > 150)
                {
                    // 抛出自定义异常，传入错误消息
                    throw new InvalidAgeException($"年龄{age}无效（有效范围：0-150）");
                }
                Console.WriteLine($"年龄验证通过：{age}岁");
            }
            // 捕获自定义异常
            catch (InvalidAgeException ex)
            {
                Console.WriteLine($"捕获到自定义异常：{ex.Message}");
                Console.WriteLine("处理方式：请输入0-150之间的有效年龄");
            }
            finally
            {
                Console.WriteLine("自定义异常示例的finally块执行完毕");
            }
        }
    }
}
